(function($) {
  var target = null;
  var template = null;
  var lock = false;
  var isload = true;
  var variables = {
    'last': 0
  }
  var settings = {
    'amount': '10',
    'address': 'comments.php',
    'postStr': '',
    'format': 'json',
    'template': '.single_item',
    'trigger': '.get_more',
    'scroll': 'false',
    'offset': '100',
    'spinner_code': ''
  }

  var methods = {
    init: function(options,voption) {
      return this.each(function() {

        if (options) {
          $.extend(settings, options);
        }
        if (voption) {
          $.extend(variables, voption);
        }
        template = $(this).children(settings.template).wrap('<div/>').parent();
        template.css('display', 'none')
        $(this).append('<div class="more_loader_spinner">' + settings.spinner_code + '</div>')
        $(this).children(settings.template).remove()
        target = $(this);
        if (settings.scroll == 'false') {
          $(this).find(settings.trigger).bind('click.more', methods.get_data);
          $(this).more('get_data');
        }
        else {
          if ($(this).height() <= $(this).attr('scrollHeight')) {
            target.more('get_data', settings.amount * 2);
          }
          $(this).bind('scroll.more', methods.check_scroll);
        }
      })
    },
    check_scroll: function() {
      if ((target.scrollTop() + target.height() + parseInt(settings.offset)) >= target.attr('scrollHeight') && lock == false) {
        target.more('get_data');
      }
    },
    debug: function() {
      var debug_string = '';
      $.each(variables, function(k, v) {
        debug_string += k + ' : ' + v + '\n';
      })
      alert(debug_string);
    },
    remove: function() {
      target.children(settings.trigger).unbind('.more');
      target.unbind('.more')
      target.children(settings.trigger).remove();
    },
    add_elements: function(data) {
      //alert('adding elements')

      var root = target
      //   alert(root.attr('id'))
      var counter = 0;
      if (data) {
        $(data).each(function() {
          counter++
          var t = template
          $.each(this, function(key, value) {
            if (t.find('.' + key))
              t.find('.' + key).html(value);
          })
          isload = true;
          //t.attr('id', 'more_element_'+ (variables.last++))
          if (settings.scroll == 'true') {
            //    root.append(t.html())
            root.children('.more_loader_spinner').before(t.html())
          } else {
            //    alert('...')

            root.children(settings.trigger).before(t.html())

          }

          root.children(settings.template + ':last').attr('id', 'more_element_' + ((variables.last++) + 1))

        })


      }
      else
        methods.remove()
      target.children('.more_loader_spinner').css('display', 'none');
      if (counter < settings.amount)
        methods.remove()

    },
    get_data: function() {
      // alert('getting data')
      var ile;
      lock = true;
      target.children(".more_loader_spinner").css('display', 'block');
      $(settings.trigger).css('display', 'none');
      if (typeof (arguments[0]) == 'number')
        ile = arguments[0];
      else {
        ile = settings.amount;
      }

      $.post(settings.address, {
        last: variables.last,
        amount: ile,
        postStr:settings.postStr
      }, function(data) {
        $(settings.trigger).css('display', 'block')
        methods.add_elements(data)
        lock = false;
      }, settings.format)

    }
  };
  $.fn.more = function(method) {
    if (methods[method])
      return methods[ method ].apply(this, Array.prototype.slice.call(arguments, 1));
    else if (typeof method == 'object' || !method)
      return methods.init.apply(this, arguments);
    else
      $.error('Method ' + method + ' does not exist!');

  }
  $(document).ready(function() {
    $(window).on('scroll', function() {
      if ($(document).scrollTop() + $(window).height() > $(document).height() - settings.offset) {
        setTimeout(function()
        {
          if (isload) {
            isload = false;
            $(settings.trigger).click();
          }
        }, 500);
      }
    });
  });

})(jQuery)